# -*- coding: utf-8 -*-
# @Author  : longbhu
# @Time    : 2025/5/26 12:28
# @Function:
# -*- coding: utf-8 -*-
# @Author  : longbhu
# @Time    : 2025/5/23 11:33
# @Function: 实现将核算好的GEP数据（tif文件），按照规则提取到指定的文件夹

import os
import logging
from logging.handlers import RotatingFileHandler
from calc_region import process_gep_data, rename_xiangCode_replace_provinceCode, create_admin_code_mapping, \
    analyze_tif_files_xiang, combine_excel_files, process_gep_analysis
from tif_stats.sum.ap_wp_excel_sum import process_excel_file

# 配置日志
# logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(lineno)d - %(message)s',filename='app.log',filemode='w')
# 设置日志格式
log_format = '%(asctime)s - %(levelname)s - %(lineno)d - %(message)s'

# 创建日志记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter(log_format))
logger.addHandler(console_handler)

# 创建文件处理器（支持日志轮转）
file_handler = RotatingFileHandler('info_app.log', maxBytes=1024*1024*5, backupCount=3)
file_handler.setFormatter(logging.Formatter(log_format))
logger.addHandler(file_handler)


"""
level:
含义：设置日志记录的最低级别。低于此级别的日志消息将被忽略。
类型：int 或 str
常见级别：
logging.DEBUG (10)：详细信息，通常用于调试。
logging.INFO (20)：一般信息，如程序运行状态。
logging.WARNING (30)：警告信息，表示可能有问题。
logging.ERROR (40)：错误信息，表示程序运行中出现错误。
logging.CRITICAL (50)：严重错误信息，可能导致程序崩溃。
示例：level=logging.INFO 表示只记录 INFO 及以上级别的日志。

'w'：写模式，每次运行程序时会覆盖之前的日志。
'a'：追加模式，新的日志会追加到文件末尾。
示例：filemode='w' 表示每次运行程序时覆盖之前的日志文件。
"""


import os
import glob
import pandas as pd
from typing import Dict, Any, List, Union

def combine_excel_files(
    folder_path: str,
    sheet_names: Union[str, List[str]] = 'Sheet1',
    output_file: str = 'combined_file.xlsx',
    include_subdirectories: bool = False
) -> Dict[str, Any]:
    """
    读取指定文件夹中的所有 Excel 文件（.xlsx），合并指定工作表（sheet）内容，
    并保存为一个新的 Excel 文件。

    :param folder_path: 包含 Excel 文件的文件夹路径
    :param sheet_names: 要读取的工作表名称，可以是单个名称或名称列表，默认是 'Sheet1'
    :param output_file: 输出文件路径或文件名，默认为 'combined_file.xlsx'
    :param include_subdirectories: 是否包含子目录中的 Excel 文件，默认为 False

    :return: 包含结果信息的字典，例如成功状态、输出文件路径和总行数。
    """

    # 构建搜索模式
    pattern = os.path.join(folder_path, '**', '*.xlsx') if include_subdirectories else os.path.join(folder_path, '*.xlsx')

    # 获取所有 Excel 文件路径
    excel_files = glob.glob(pattern, recursive=include_subdirectories)

    if not excel_files:
        return {
            "success": False,
            "message": f"在路径 {folder_path} 中未找到任何 Excel 文件。",
        }

    # 初始化一个字典来存储每个工作表的合并数据
    combined_sheets = {}

    # 遍历每个 Excel 文件并读取指定工作表
    for file in excel_files:
        try:
            # 如果 sheet_names 是字符串，转换为列表
            if isinstance(sheet_names, str):
                sheet_names_list = [sheet_names]
            else:
                sheet_names_list = sheet_names

            # 读取每个指定的工作表
            for sheet in sheet_names_list:
                try:
                    df = pd.read_excel(file, sheet_name=sheet)
                    # 如果工作表名称不在字典中，则初始化一个空列表
                    if sheet not in combined_sheets:
                        combined_sheets[sheet] = pd.DataFrame()
                    # 将数据追加到对应工作表的 DataFrame 中
                    combined_sheets[sheet] = pd.concat([combined_sheets[sheet], df], ignore_index=True)
                except Exception as e:
                    print(f"无法读取文件 {file} 的工作表 {sheet}：{e}")
                    continue
        except Exception as e:
            print(f"无法读取文件 {file}：{e}")
            continue

    # 确保输出目录存在
    output_dir = os.path.dirname(output_file)
    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 保存合并后的数据到新的 Excel 文件
    with pd.ExcelWriter(output_file) as writer:
        for sheet_name, df in combined_sheets.items():
            df.to_excel(writer, sheet_name=sheet_name, index=False)

    return {
        "success": True,
        "output_file": output_file,
        "total_rows": {sheet: len(df) for sheet, df in combined_sheets.items()},
        "message": f"成功合并 {len(excel_files)} 个文件，每个工作表的行数为：{ {sheet: len(df) for sheet, df in combined_sheets.items()} }。"
    }

if __name__ == "__main__":
    # 定义常量
    GEP_RESULT_PATH = r'I:\GEP_result\test'
    GEP_PROJECT_PATH = r'I:\GEP_project'
    SHAPEFILE_PATH = r'E:\shp\2025购买边界shp2021\全国统计乡镇区划'
    EXCEL_PATH = r'H:\GEP_excel_data\V_price\价格表-总表.xlsx'

    # 示例用法
    admin_code = '360000'  # 北京市的行政区划代码
    target_shi_name = None
    target_xian_name = '铅山县'

    shp_path = os.path.join(SHAPEFILE_PATH, target_xian_name)

    years  = [2023,  2024]
    for year in years:
        root_folder = rf'I:\GEP_project\360000\test\{year}_36'

        process_gep_analysis(
            root_folder=root_folder,
            shp_path=shp_path,
        )

        # 将多个excel报告合并成一个
        output_file = os.path.join(os.path.dirname(root_folder), f'combined_gep_{target_xian_name}_{year}_处理结果.xlsx')

        result = combine_excel_files(
            folder_path=root_folder,
            sheet_names=['Sheet1', '处理结果'],
            output_file=output_file,
            include_subdirectories=False
        )





